package cl.jsoftlabs.gwt.soccer.client.ui.futbolclub;

import cl.jsoftlabs.gwt.soccer.client.AppConstantes;
import cl.jsoftlabs.gwt.soccer.client.bean.FutbolClubVO;
import cl.jsoftlabs.gwt.soccer.client.bean.PaisVO;
import cl.jsoftlabs.gwt.soccer.client.services.FutbolClubService;
import cl.jsoftlabs.gwt.soccer.client.services.FutbolClubServiceAsync;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.Orientation;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.button.ButtonBar;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;

public class FutbolClubForm extends Window {
	
	// gwt service
	final FutbolClubServiceAsync rpcFCService = FutbolClubService.Util.getInstance();
	
	private FormPanel frmpnlPanelformulario = new FormPanel();
	
	private TextField<String> txtfldNombreCf = new TextField<String>();
	private ComboBox<BeanModel> cmbxPaisfc = new ComboBox<BeanModel>();
	
	private ButtonBar buttonBar = new ButtonBar();
	private Button btnGuardarCambios = new Button("Guardar");
	private Button btnCancelar = new Button("Cancelar");
	
	Integer idFC = 0;
	
	FutbolClubVO club = new FutbolClubVO();
	
	ListStore<BeanModel> paisStore = new ListStore<BeanModel>();
	
	//RETORNO AL INICIAR EL FORMULARIO Y LA BUSQUEDA
	private AsyncCallback<FutbolClubVO> callbackFind = new AsyncCallback<FutbolClubVO>() {
		
		@Override
		public void onSuccess(FutbolClubVO result) {
			if (result == null) {
				setHeading("Nuevo Registro");
				Info.display("Club de Futbol", "Nuevo Registro "+idFC);
			} else {
				club = result;
				BeanModel paisBeanModel = paisStore.findModel("codTres", result.getPaisVO().getCodTres());
				Info.display("Busqueda", result.getNombreClub() +" - "+ result.getPaisVO().getCodTres());
				txtfldNombreCf.setValue(result.getNombreClub());
				cmbxPaisfc.setValue(paisBeanModel);
				setHeading("Modificar Registro");
			}
		}
		@Override
		public void onFailure(Throwable caught) {
			Info.display("Club de Futbol", "Ocurrio un Error");
		}
	};
	
	//RETORNO AL GURADAR UN REGISTRO
	private AsyncCallback<Integer> saveCallback = new AsyncCallback<Integer>() {
		@Override
		public void onSuccess(Integer result) {
			if (result == AppConstantes.SATISFACTORIO) {
				Info.display("Guardar Futbol Club", "El Registro fue Guardado con Exito" );
				hide();
			} else {
				Info.display("Guardar Futbol Club", "Algo Fallo en el Proceso" );
			}
		}
		@Override
		public void onFailure(Throwable caught) {
			Info.display("Guardar Futbol Club", "Mal");
		}
	};
	
	/* codigo innecesario por el data-backed
	BeanModelFactory beanModelFactory = BeanModelLookup.get().getFactory(PaisVO.class);
	PaisVO chile = new PaisVO(12, "CL", "CHL", "Chile");
	PaisVO argentina = new PaisVO(13, "AR", "ARG", "Argentina");
	*/

	public void setIdFC(Integer idFC) {
		this.idFC = idFC;
	}

	@Override
	protected void onRender(Element parent, int pos) {
		super.onRender(parent, pos);
		llenarPaisStore();
		buscarRegistroModificacion();
	}

	private void buscarRegistroModificacion() {	rpcFCService.obtenerClub(idFC, callbackFind); }

	public FutbolClubForm() {
		setResizable(false);
		setBlinkModal(true);
		setModal(true);
		setLayout(new RowLayout(Orientation.VERTICAL));
		
		frmpnlPanelformulario.setHeaderVisible(false);
		frmpnlPanelformulario.setHeading("PanelFormulario");
		frmpnlPanelformulario.setCollapsible(true);
		
		frmpnlPanelformulario.add(txtfldNombreCf, new FormData("100%"));
		txtfldNombreCf.setFieldLabel("Nombre CF");
		
		cmbxPaisfc.setDisplayField("nombrePais");
				
		//llenarPaisStore();
		cmbxPaisfc.enableEvents(true);
		cmbxPaisfc.setMinChars(1);
		cmbxPaisfc.setEditable(false);
		String callClassComboID = cmbxPaisfc.getId();
		cmbxPaisfc.setItemId(callClassComboID);

		cmbxPaisfc.setTriggerAction(TriggerAction.ALL);
		cmbxPaisfc.setFieldLabel("Pais");
		cmbxPaisfc.setTemplate(getTemplate());
		frmpnlPanelformulario.add(cmbxPaisfc, new FormData("100%"));
		
		
		//BOTON GUARDAR CAMBIOS
		btnGuardarCambios.setIconStyle("save");
		
		
		//BOTON CANCELAR
		btnCancelar.setIconStyle("cancel");
		
		
		buttonBar.setAlignment(HorizontalAlignment.CENTER);
		botonesListeners();
		buttonBar.add(btnGuardarCambios);
		buttonBar.add(btnCancelar);
		
		
		frmpnlPanelformulario.setBottomComponent(buttonBar);
		add(frmpnlPanelformulario);
	}
	
	private void llenarPaisStore() {
		paisStore = Registry.get(AppConstantes.PAIS_STORE_LIST);
		cmbxPaisfc.setStore(paisStore);
	}
	
	private void botonesListeners(){
		btnCancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			@Override
			public void componentSelected(ButtonEvent ce) {
				hide();				
			}
		});
		btnGuardarCambios.addSelectionListener(new SelectionListener<ButtonEvent>() {
			@Override
			public void componentSelected(ButtonEvent ce) {
				PaisVO paisSeleccionado = new PaisVO();
				paisSeleccionado.setIdPais((Integer)cmbxPaisfc.getValue().get("idPais"));
				paisSeleccionado.setCodTres((String)cmbxPaisfc.getValue().get("codTres"));
				paisSeleccionado.setCodDos((String)cmbxPaisfc.getValue().get("codDos"));
				paisSeleccionado.setNombrePais((String)cmbxPaisfc.getValue().get("nombrePais"));
				club.setNombreClub(txtfldNombreCf.getValue());
				club.setPaisVO(paisSeleccionado);
				rpcFCService.guardarClub(club, saveCallback);
				hide();
			}
		});
	}
	
	private String getTemplate() {
		StringBuilder sb = new StringBuilder();
		sb.append("<tpl for=\".\">");
		sb.append("<div class='x-combo-list-item'>");
		sb.append("<img src=\"img/banderas/{codDos}.png\"/>");
		//sb.append("<img src=\"img/blank.gif\" class=\"flag flag-{codDos}\" alt=\"{nombrePais}\" />");
		sb.append("&nbsp;<b>{nombrePais}</b> -  {codDos}");
		sb.append("</div>");
		sb.append("</tpl>");
		return sb.toString();
	}

}
